iT邦幫忙

0

【Firebase】Cloud Messaging API (舊版淘汰!) 更換 Firebase Cloud Messaging API (V1)

  • 分享至 

  • xImage
  •  

最近好久沒登入 Firebase 管理推播,沒想到登入確認的時候,發現【雲端通訊】的推播伺服器API已經升級了-.-a
如下:
舊版 HTTP 或 XMPP API (已於 2023 年 6 月 20 日淘汰),請務必在 2024 年 6 月 20 日以前,改用最新的 Firebase Cloud Messaging API (HTTP v1)
https://ithelp.ithome.com.tw/upload/images/20230914/20061369cij0c3We2Q.png

經點擊【瞭解詳情】後,開啟網頁查看解說。
https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=zh&authuser=0&_gl=11yc83x4_gaMTMzNDU0MDY5LjE2ODYxMDI5NzQ._ga_CW55HF8NVT*MTY5NDY3NzAxMy4yNC4xLjE2OTQ2NzgxODEuMC4wLjA.

得知固定的Server Key,改成隨機Server Bearer方式登入,將固定發送位置改成伺服器專案發送位置,以及原先推播通知的Json內容,也要改成新的Json內容動應。
https://ithelp.ithome.com.tw/upload/images/20230914/20061369TnmQhIytP5.png
https://ithelp.ithome.com.tw/upload/images/20230914/20061369WP0fg3WsWL.png
https://ithelp.ithome.com.tw/upload/images/20230914/20061369h041QhFW3E.png

知道以上API更新內容後,我發現我現有的程式碼版本無法直接取得【隨機Server Bearer】
因為我是用asp net(vb)架站的,Firebase沒提供微軟程式碼的取得方式
只提供node.js、JAVA、Python、Go這四種語言方式登入
後來找了範例一陣子,在用node.js範例終於有解了(我測試成功了!)

node.js教學範例參考網址:
[Firebase] Messaging 推播訊息 利用Nodejs發送推播
https://vocus.cc/article/64545d9dfd89780001b87527

1.首先開啟命令提示字元或輸入cmd開啟
2.因為位置會在系統碟的User位置,所以我下【cd /d d:\】,變更到D槽位置。
3.建立FCM測試目錄,所以我下【mkdir FcnMsg】建立空目錄
4.移動到FcnMsg目錄,所以我下【cd FcnMsg】移動。
5.執行【npm init】指令初始化,這邊要注意你的電腦要有安裝nod.js軟體才有。
6.執行【npm init】指令後,會問你一堆問題,全部都直接enter過去不管!最後輸入yes結束。
https://ithelp.ithome.com.tw/upload/images/20230914/20061369YsFS9sXVBp.png

7.在FcnMsg目錄下,就會生成package.json檔案。
https://ithelp.ithome.com.tw/upload/images/20230914/200613690qD06JbgKG.png

8.這邊我有安裝VS 2022免費開發版本,採用此軟體打開FcnMsg目錄,建立專案。
https://ithelp.ithome.com.tw/upload/images/20230914/200613692UkJufpUor.png
https://ithelp.ithome.com.tw/upload/images/20230914/20061369vWqJf2hXrZ.png

9.在FcnMsg資料夾內新增index.js
https://ithelp.ithome.com.tw/upload/images/20230914/20061369KT48arPoGI.png

10.再新增key.json,將在firebase的新API版本(Firebase Cloud Messaging API)的私密金鑰內容完整的貼進來
https://ithelp.ithome.com.tw/upload/images/20230914/20061369UTqBWmPyb6.png

11.然後在FcnMsg目錄下,下指令安裝googleapis需要的引用檔案【npm i https googleapis -s】
https://ithelp.ithome.com.tw/upload/images/20230914/20061369mYfP8NfLxM.png
https://ithelp.ithome.com.tw/upload/images/20230914/20061369Oz30eDugf1.png

12.之後在index.js貼上下列程式碼(範例程式碼)

const https = require('https')
var {google} = require('googleapis')

const key = require('./key.json')
const PROJECT_ID = key.project_id;
const HOST = 'fcm.googleapis.com';
const PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
const MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
const SCOPES = [MESSAGING_SCOPE];



function getAccessToken() {
    return new Promise(function(resolve, reject) {
      const jwtClient = new google.auth.JWT(
        key.client_email,
        null,
        key.private_key,
        SCOPES,
        null
      )
      jwtClient.authorize(function(err, tokens) {
        if (err) {
          reject(err);
          return;
        }
        resolve(tokens.access_token);
      });
    });
  }
  
 /**
 * Send HTTP request to FCM with given message.
 *
 * @param {object} fcmMessage will make up the body of the request.
 */
function sendFcmMessage (fcmMessage) {
    getAccessToken().then(function(accessToken) {
      const options = {
        hostname: HOST,
        path: PATH,
        method: 'POST',
        // [START use_access_token]
        headers: {
          'Authorization': 'Bearer ' + accessToken
        }
        // [END use_access_token]
      };
  
      const request = https.request(options, function(resp) {
        resp.setEncoding('utf8');
        resp.on('data', function(data) {
          console.log('Message sent to Firebase for delivery, response:');
          console.log(data);
        });
      });
  
      request.on('error', function(err) {
        console.log('Unable to send message to Firebase');
        console.log(err);
      });
  
      request.write(JSON.stringify(fcmMessage));
      request.end();
    });
  }

   /**
   * Construct a JSON object that will be used to define the
   * common parts of a notification message that will be sent
   * to any app instance subscribed to the news topic.
   */
   function buildCommonMessage() {
    return {
      'message': {
        'topic': 'all',
        'notification': {
          'title': 'FCM Notification',
          'body': 'Notification from FCM',
        }
      }
    };
  }


  const commonMessage = buildCommonMessage();
  console.log('FCM request body for message using common notification object:');
  console.log(JSON.stringify(commonMessage, null, 2));
  sendFcmMessage(buildCommonMessage());

https://ithelp.ithome.com.tw/upload/images/20230914/200613698Oh9lk9uUu.png

13.完成之後,要用node 去執行index.js的程式,測試發送message,在command line下輸入【node index.js】
14.然後command line就會出現以下訊息
https://ithelp.ithome.com.tw/upload/images/20230914/20061369WLQ5m5wuUE.png

15.依照firebase官方文件,response出現下列文字就是正常可以發送。

Message sent to Firebase for delivery, response:
{
  "name": "projects/你的專案ID名稱/messages/6706995508339509644"
}

16.以上經由範例測試後,得知如何只取得【Server Bearer】,在丟回我的vb網頁在使用!
17.新增Bearer.js檔案,用來只取得Bearer Key資料
https://ithelp.ithome.com.tw/upload/images/20230914/20061369Zh0qubq6M9.png

const https = require('https')
var { google } = require('googleapis')

const key = require('./key.json')
const PROJECT_ID = key.project_id;
const HOST = 'fcm.googleapis.com';
const PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
const MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
const SCOPES = [MESSAGING_SCOPE];
function getAccessToken() {
    return new Promise(function (resolve, reject) {
        const jwtClient = new google.auth.JWT(
            key.client_email,
            null,
            key.private_key,
            SCOPES,
            null
        )
        jwtClient.authorize(function (err, tokens) {
            if (err) {
                reject(err);
                return;
            }
            resolve(tokens.access_token);
        });
    });
}

function GetData() {
    getAccessToken().then(function (accessToken) {
        console.log(accessToken);
    });
}

GetData();

18.在命令提示字元,輸入執行【node Bearer.js】,就會得到Server Bearer key
https://ithelp.ithome.com.tw/upload/images/20230914/20061369vcixylVpiL.png

19.然後返回我的asp網頁,寫程式碼取得命令提示字元輸出的內容資料

<%@ Page Title="" Language="VB"  %>
<script runat="server">
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        
        Dim App_Str As String = Server.MapPath("./") & "Bearer.js"
        
        Dim p As System.Diagnostics.Process = New System.Diagnostics.Process()
        
        p.StartInfo.FileName = "node"
        p.StartInfo.Arguments = App_Str
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.Start()
        
        Response.Write(p.StandardOutput.ReadToEnd())
        
        p.WaitForExit()

    End Sub
</script>

20.然後我是用區網新架win10方式,因為Server版本太舊無法安裝node.js,只能繞遠路..
以前Firebase是這樣簡單方式,固定Server Key方送
https://ithelp.ithome.com.tw/upload/images/20230914/20061369q21fbuqCtx.png

改成要先到Firebase取得Bearer key才可以發送...
https://ithelp.ithome.com.tw/upload/images/20230914/20061369qUMxTD0vaq.png

真是繞好大圈= =....

下一篇更新方式~
Firebase專案-伺服器推播用Asp.net (VB) 取得BearerKey驗證
https://ithelp.ithome.com.tw/articles/10325909


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言